/*
 * @Copyright    : Blueray Med .ltd
 * @file name    : Filename
 * @Date         : 2022-10-19 16:03:50
 * @LastEditor   : Liam
 * @Description  : 按键扫描
 */
#include "btn_scan.h"
#include "myQueue.h"

/* 定义结构体 */
systemStruct sysSt;
/**
 * @Function: btn_click_tick
 * @Description: 用于产生按钮点击扫描信号,放在1ms的定时器中调用
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: 每进入一次函数，tick；tick500加1
 * @result: Success
 */
/* 扫描信号处理 */
bit is_btn_scan = 0;	  // 是否要进行30ms按钮点击扫描
bit is_btn_scan_500 = 0;  // 是否要进行500ms按钮点击扫描
bit is_btn_scan_1000 = 0; // 是否要进行1000ms按钮点击扫描
void btn_click_tick()
{
#define BTN_SCAN_PERIOD 90		  // 按钮点击事件的扫描周期,单位ms
#define BTN_SCAN_PERIOD_500 500	  // 按钮点击事件的扫描周期,单位ms
#define BTN_SCAN_PERIOD_1000 1000 // 按钮点击事件的扫描周期,单位ms

	static idata u8 tick = 0;
	static idata u16 tick500 = 0;
	static idata u16 tick1000 = 0;

	tick++;
	tick500++;
	tick1000++;

	if (tick == BTN_SCAN_PERIOD) // 当计数值等于预设的值时，产生一个按钮点击扫描信号is_btn_scan。
	{
		tick = 0;
		is_btn_scan = 1;
	}
	if (tick500 == BTN_SCAN_PERIOD_500) // 当计数值等于预设的值时，产生一个按钮点击扫描信号is_btn_scan_500。
	{
		tick500 = 0;
		is_btn_scan_500 = 1;
	}
	if (tick1000 == BTN_SCAN_PERIOD_1000) // 当计数值等于预设的值时，产生一个按钮点击扫描信号is_btn_scan_500。
	{
		tick1000 = 0;
		is_btn_scan_1000 = 1;
	}
}
/**
 * @Function: btn_click_handler_1000
 * @Description: 每1000ms进行处理的任务，用于信息的查询。
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void btn_click_handler_1000()
{
	if (is_btn_scan_1000 == 1) // 是否有扫描信号,没有的话就也不做,直接返回
	{
		is_btn_scan_1000 = 0;	 // 扫描信号标志清除
		the_system_query_slow(); // 1000ms所执行的任务函数
	}
}
/**
 * @Function: btn_click_handler_500
 * @Description: 每500ms进行处理的任务，用于信息的查询。以及报警的查询
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void btn_click_handler_500()
{
	if (is_btn_scan_500 == 1) // 是否有扫描信号,没有的话就也不做,直接返回
	{
		is_btn_scan_500 = 0;	 // 扫描信号标志清除
		the_system_query_fast(); // 500ms所执行的任务函数
	}
}
/**
 * @Function: btn_click_handler_30ms
 * @Description: 每30ms执行一次，用于按键的扫描；主循环进行查询按键，主要的按键查询键值在这里
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void btn_click_handler_30ms()
{
	if (is_btn_scan == 1) // 是否有扫描信号,没有的话就也不做,直接返回
	{
		is_btn_scan = 0; // 扫描信号标志清除
		the_system_btn();
	}
}
/**
 * @Function: the_system_btn
 * @Description: 此函数读取按键的当前值，并进行处理。
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success.
 *
 */
void the_system_btn()
{
	/* 读取参数操作 */
	sys_read_vp(PIC_NOW, (u8 *)&sysSt.pagenum_now_val, 1);
	sys_read_vp(PAGE_BTN_NUM, (u8 *)&sysSt.pagenum_btn_val, 1);
	/* 处理操作 */
	page_to_page_handler_function (sysSt.pagenum_now_val,sysSt.pagenum_btn_val);
	save_btn_handler();
	send_pressure_flow_handler();
	long_press_function(sysSt.pagenum_now_val);
	set_max_flow();
	/* 语言模式 */
	sys_read_vp(LANGUAGE_MODE, (u8 *)&sysSt.language_mode, 1); /* 读取按键值 */
	language_choose(sysSt.language_mode);					   /* 将语言mode写入 */

}
/**
 * @Function: the_system_query_fast
 * @Description: 问询函数，500ms调用一次，在不同的页面，询问不同的
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void the_system_query_fast()
{
	switch (sysSt.pagenum_now_val)
	{
	case PIC_NUM_OPEN_ACTION:
		sysSt.open_sec++;
		my_queue_enqueue(PROTOCOL_READ, SET_MAIN_PRESSURE, 2, PTR_NUM_1); /* 读取参数 */
		if (sysSt.open_sec >= 5)
		{
			pic_set(PIC_NUM_KPA_MAIN);
		}
		break;
	case PIC_NUM_KPA_MAIN:
	case PIC_NUM_KPA_READY:
	case PIC_NUM_HG_MAIN:
	case PIC_NUM_HG_READY:
		my_queue_enqueue(PROTOCOL_READ, NOW_PRESSURE, 1, WARNING_FLAG, 1, PTR_NUM_2); /* 读取参数 */
		break;
	case PIC_NUM_CALIBRATE:
		my_queue_enqueue(PROTOCOL_READ, ADC_NOW, 1, NOW_PRESSURE, 1, PTR_NUM_2); /* 读取参数 */
		break;
	default:
		break;
	}
}
/**
 * @Function: the_system_query_slow
 * @Description: 问询函数，1000ms调用一次，在不同的页面，询问不同的参数
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void the_system_query_slow()
{
	if (sysSt.pagenum_now_val == PIC_NUM_KPA_READY || sysSt.pagenum_now_val == PIC_NUM_HG_READY) /* 在准备界面 */
	{
		warning_handler();
	}
}
